home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
dev
/
lang
/
sofa.lha
/
sofa
/
smalleiffel
/
lib_se
/
manifest_string.e
< prev
next >
Wrap
Text File
|
2000-03-25
|
9KB
|
392 lines
-- This file is part of SmallEiffel The GNU Eiffel Compiler.
-- Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
-- Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
-- http://SmallEiffel.loria.fr
-- SmallEiffel is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2, or (at your option) any later
-- version. SmallEiffel is distributed in the hope that it will be useful,but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- for more details. You should have received a copy of the GNU General
-- Public License along with SmallEiffel; see the file COPYING. If not,
-- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-- Boston, MA 02111-1307, USA.
--
class MANIFEST_STRING
--
-- When using Manifest Constant STRING.
--
inherit EXPRESSION;
creation {EIFFEL_PARSER} make
feature
start_position: POSITION;
-- Of the first character '%"'.
to_string: STRING;
-- Eiffel contents of the string.
feature {NONE}
break: ARRAY[INTEGER];
-- If not Void, places in `to_string' where extended notation (with
-- line(s) break) is used. The corresponding character in to string
-- is put on next line.
ascii: ARRAY[INTEGER];
-- If not Void, places in `to_string' where character are to be
-- printed using asci code notation.
percent: ARRAY[INTEGER];
-- If not Void, places in `to_string' where character are to be
-- printed using percent.
feature {MANIFEST_STRING,MANIFEST_STRING_POOL}
mangling: STRING;
-- When runnable. Name to be used for the corresponding C
-- global variable or for the JVM corresponding field.
feature
is_manifest_string: BOOLEAN is true;
is_manifest_array: BOOLEAN is false;
is_writable: BOOLEAN is false;
is_current: BOOLEAN is false;
is_static: BOOLEAN is false;
is_void: BOOLEAN is false;
is_result: BOOLEAN is false;
use_current: BOOLEAN is false;
is_pre_computable: BOOLEAN is true;
c_simple: BOOLEAN is true;
can_be_dropped: BOOLEAN is true;
static_result_base_class: BASE_CLASS is
do
Result := small_eiffel.get_class(as_string);
end;
result_type: TYPE_STRING is
do
Result := type_string;
end;
assertion_check(tag: CHARACTER) is
do
end;
static_value: INTEGER is
do
end;
isa_dca_inline_argument: INTEGER is
do
end;
dca_inline_argument(formal_arg_type: TYPE) is
do
end;
mapping_c_target(target_type: TYPE) is
do
cpp.put_string(mangling);
end;
mapping_c_arg(formal_arg_type: TYPE) is
do
compile_to_c;
end;
collect_c_tmp is
do
end;
compile_to_c is
do
cpp.put_character('(');
cpp.put_string(fz_cast_t0_star);
cpp.put_string(mangling);
cpp.put_character(')');
end;
c_declare_for_old is
do
end;
compile_to_c_old is
do
end;
compile_to_jvm_old is
do
end;
afd_check is
do
end;
count: INTEGER is
do
Result := to_string.count;
end;
compile_target_to_jvm, compile_to_jvm is
local
idx: INTEGER;
do
idx := fieldref_idx;
code_attribute.opcode_getstatic(idx,1);
end;
compile_to_jvm_assignment(a: ASSIGNMENT) is
do
end;
jvm_branch_if_false: INTEGER is
do
end;
jvm_branch_if_true: INTEGER is
do
end;
compile_to_jvm_into(dest: TYPE): INTEGER is
do
Result := 1;
compile_to_jvm;
end;
to_runnable(ct: TYPE): MANIFEST_STRING is
do
if mangling = Void then
mangling := manifest_string_pool.register(Current);
end;
Result := Current;
end;
stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
do
Result := true;
end;
precedence: INTEGER is
do
Result := atomic_precedence;
end;
bracketed_pretty_print, pretty_print is
local
i, column: INTEGER;
do
from
column := fmt.column;
fmt.put_character('%"');
i := 1;
until
i > to_string.count
loop
if is_on_next_line(i) then
fmt.put_string("%%%N");
from
until
column = fmt.column
loop
fmt.put_character(' ');
end;
fmt.put_character('%%');
end;
pretty_print_character(i);
i := i + 1;
end;
fmt.put_character('%"');
end;
print_as_target is
do
fmt.put_character('(');
pretty_print;
fmt.put_character(')');
fmt.put_character('.');
end;
short is
local
i: INTEGER;
do
short_print.hook_or("open_ms","%"");
from
i := 1;
until
i > to_string.count
loop
short_character(i);
i := i + 1;
end;
short_print.hook_or("close_ms","%"");
end;
short_target is
do
bracketed_short;
short_print.a_dot;
end;
feature {EIFFEL_PARSER}
add(ch: CHARACTER) is
-- Append `ch' to manifest string setting ordinary printing mode.
do
to_string.extend(ch);
end;
add_ascii(ch: CHARACTER) is
-- Append `ch' to manifest string setting `ascii' printing mode.
do
to_string.extend(ch);
if ascii = Void then
!!ascii.with_capacity(4,1);
end;
ascii.add_last(to_string.count);
end;
add_percent(ch: CHARACTER) is
-- Append `ch' to manifest string setting `percent' printing mode.
do
to_string.extend(ch);
if percent = Void then
!!percent.with_capacity(4,1);
end;
percent.add_last(to_string.count);
end;
break_line is
-- Next character will be a `break'.
do
if break = Void then
!!break.with_capacity(4,1);
end;
break.add_last(to_string.count + 1);
end;
feature {CREATION_CALL,EXPRESSION_WITH_COMMENT}
jvm_assign is
do
end;
feature {MANIFEST_STRING_POOL}
fieldref_idx: INTEGER is
do
Result := constant_pool.idx_fieldref_for_manifest_string(mangling);
end;
feature {NONE}
make(sp: like start_position) is
require
not sp.is_unknown
do
start_position := sp;
!!to_string.make(0);
ensure
start_position = sp
end;
tmp_string: STRING is
once
!!Result.make(8);
end;
pretty_print_character(i: INTEGER) is
require
1 <= i;
i <= count;
local
val: INTEGER;
do
if percent /= Void and then percent.fast_has(i) then
tmp_string.clear;
character_coding(to_string.item(i),tmp_string);
fmt.put_string(tmp_string);
elseif ascii /= Void and then ascii.fast_has(i) then
val := to_string.item(i).code;
fmt.put_string("%%/");
fmt.put_integer(val);
fmt.put_string(as_slash);
else
fmt.put_character(to_string.item(i));
end;
end;
short_character(i: INTEGER) is
require
1 <= i;
i <= count;
local
val: INTEGER;
c: CHARACTER;
do
tmp_string.clear;
if percent /= Void and then percent.fast_has(i) then
character_coding(to_string.item(i),tmp_string);
elseif ascii /= Void and then ascii.fast_has(i) then
val := to_string.item(i).code;
tmp_string.append("%%/");
val.append_in(tmp_string);
tmp_string.append(as_slash);
end;
if tmp_string.count = 0 then
short_print.a_character(to_string.item(i));
else
from
val := 1;
until
val > tmp_string.count
loop
c := tmp_string.item(val);
if c = '%%' then
short_print.hook_or("Prcnt_ms","%%");
elseif c = '/' then
short_print.hook_or("Slash_ms",as_slash);
else
short_print.a_character(c);
end;
val := val + 1;
end;
end;
end;
is_on_next_line(i: INTEGER): BOOLEAN is
require
1 <= i;
i <= count;
do
if break /= Void then
Result := break.fast_has(i);
end;
end;
invariant
not start_position.is_unknown;
to_string /= Void;
end -- MANIFEST_STRING